﻿/*
 * Created by SharpDevelop.
 * User: LBALERI
 * Date: 07/02/2013
 * Time: 09:10 a.m.
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Data;
using System.Data.OleDb;
using System.Linq.Expressions;
using System.Windows.Forms;
using System.Collections.Generic;

namespace CapturaImagen
{
	/// <summary>
	/// Description of DAOAtributos.
	/// </summary>
	public class DAOAtributos
	{
		static OleDbConnection conexion;
		
		public DAOAtributos()
		{
		}
		public static Boolean insertarAtributos(int id_muestra, int fueraDeTipo,int danioBiologico,int granoPOP, string color_grano, string color_marlo, string observacion){
            Boolean correcto = false;
            try{
                
				conexion = ConexionDatos.conectarAccess();
				string sql = "INSERT INTO atributo(id_muestra, fueraDeTipo, danioBiologico, granoPOP, color_grano, color_marlo, observacion)" +
                    "VALUES(@id_muestra, @fueraDeTipo, @danioBiologico, @granoPOP, @color_grano, @color_marlo, @observacion)";
				OleDbCommand cmd = new OleDbCommand(sql, conexion);
				conexion.Open();
				cmd.Parameters.AddWithValue("@id_muestra",id_muestra);
				cmd.Parameters.AddWithValue("@fueraDeTipo",fueraDeTipo);
                cmd.Parameters.AddWithValue("@danioBiologico", danioBiologico);
				cmd.Parameters.AddWithValue("@granoPOP",granoPOP);
				cmd.Parameters.AddWithValue("@color_grano",color_grano);
				cmd.Parameters.AddWithValue("@color_marlo",color_marlo);
                cmd.Parameters.AddWithValue("@observacion", observacion);
				
				cmd.ExecuteNonQuery();
				ConexionDatos.desconectarAccess();
                correcto = true;
			}catch(Exception ex){
                EscribirLog.escribirArchivo(ex.Message);
				MessageBox.Show("Error al cargar!!","Alerta",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
				ConexionDatos.desconectarAccess();
			}

            return correcto;
		}
		
		public static Boolean insertarMuestra(string muestra, string fecha, string batchLote, string clase){
            Boolean correcto = false;
            try
            {
                conexion = ConexionDatos.conectarAccess();
                string sql = "INSERT INTO muestra(muestra, fecha_ingreso, batch_lote, clase) VALUES(@muestra,@fecha,@batch_lote, @clase)";
                OleDbCommand cmd = new OleDbCommand(sql, conexion);

                cmd.Parameters.AddWithValue("@muestra", muestra);
                cmd.Parameters.AddWithValue("@fecha", fecha);
                cmd.Parameters.AddWithValue("@batch_lote", batchLote);
                cmd.Parameters.AddWithValue("@clase", clase);
                conexion.Open();
                cmd.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {

                EscribirLog.escribirArchivo(ex.Message);

            }
            finally
            {
                ConexionDatos.desconectarAccess();
            }

            return correcto;
		}
		
		public static int buscarMuestraPorNumero(string muestra){
			int muestraEncontrada = 0;
			try {
				string id_muestra = null;
				conexion = ConexionDatos.conectarAccess();
				string sql = "SELECT muestra, MAX(ID) as numero FROM muestra WHERE muestra = '" + muestra + "' GROUP BY muestra";
				OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conexion);
				DataSet ds = new DataSet();

				conexion.Open();
				adaptador.Fill(ds);

				for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
				{
					DataRow campo = ds.Tables[0].Rows[i];
					if (muestra.Equals(campo["muestra"].ToString())) {
						id_muestra = campo["numero"].ToString();
						break;
					}
					
				}
				ConexionDatos.desconectarAccess();
				
				muestraEncontrada = Convert.ToInt32(id_muestra);
			} catch (Exception ex) {
                EscribirLog.escribirArchivo(ex.Message);
				muestraEncontrada = 0;
			}
			
			
			return muestraEncontrada;
		}
		public static Boolean insertarImagen(string ruta, int id_muestra){
            Boolean correcto = false;
            try
            {
                conexion = ConexionDatos.conectarAccess();
                string sql = "INSERT INTO imagen(id_muestra, destino_imagen) VALUES(@id_muestra,@ruta)";
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                cmd.Parameters.AddWithValue("@id_muestra", id_muestra);
                cmd.Parameters.AddWithValue("@ruta", ruta);
                conexion.Open();
                cmd.ExecuteNonQuery();
                correcto = true;

            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }

            return correcto;
		}
		
		public static DataSet obtenerListadoImagenes(){
			DataSet ds = new DataSet();
			List<String> duplicado = new List<string>();
            try
            {
                conexion = ConexionDatos.conectarAccess();
                string sql = "SELECT muestra,fecha_ingreso, clase, observacion" +
                    " FROM imagen,muestra WHERE imagen.id_muestra = muestra.ID";
                OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conexion);

                conexion.Open();
                adaptador.Fill(ds, "nueva");

            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                ds = null;
            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
			
			return ds;
		}
		
		public static String obtenerRutaImagen(String nombre){
			DataSet ds = new DataSet();
			string rutaMuestra = null;
            try
            {
                conexion = ConexionDatos.conectarAccess();
                int id_muestra = buscarMuestraPorNumero(nombre);
                OleDbCommand cmd = conexion.CreateCommand();
                cmd.CommandText = "SELECT * FROM imagen WHERE id_muestra = " + id_muestra + "";
                conexion.Open();
                OleDbDataReader lector = cmd.ExecuteReader();
                while (lector.Read())
                {
                    rutaMuestra = lector["destino_imagen"].ToString();
                }
            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                rutaMuestra = null;
            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
			
			return rutaMuestra;
		}
		
		/*public static void descartarMuestra(string nombre){
			try {
				conexion = ConexionDatos.conectarAccess();
				string sql = "UPDATE muestra SET estado = @estado WHERE muestra = @nombre";
				OleDbCommand cmd = new OleDbCommand(sql, conexion);
				cmd.Parameters.AddWithValue("@estado","Descartada");
				cmd.Parameters.AddWithValue("@nombre",nombre);
				conexion.Open();
				cmd.ExecuteNonQuery();
			} catch (Exception) {
				
				
			}
			
			ConexionDatos.desconectarAccess();
		}*/
		
		public static DataSet listarMuestras(){
			DataSet ds = new DataSet();
            try
            {
                conexion = ConexionDatos.conectarAccess();
                string sql = "SELECT muestra, fecha_ingreso, clase FROM muestra";
                OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conexion);
                conexion.Open();
                adaptador.Fill(ds, "muestra");
            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                ds = null;
            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
			
			return ds;
		}
		
		/*public static DataSet listarMuestrasDescartadas(){
			DataSet ds = new DataSet();
			try {
				conexion = ConexionDatos.conectarAccess();
				string sql = "SELECT muestra, fecha_ingreso, estado FROM muestra WHERE estado = 'Descartada'";
				OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conexion);
				
				conexion.Open();
				adaptador.Fill(ds,"muestra");
			} catch (Exception) {
				
				ds = null;
			}
			
			ConexionDatos.desconectarAccess();
			return ds;
		}*/
		
		/*public static DataSet listarMuestrasAceptadas(){
			DataSet ds = new DataSet();
			try {
				conexion = ConexionDatos.conectarAccess();
				string sql = "SELECT muestra, fecha_ingreso, estado FROM muestra WHERE estado = 'Aceptada'";
				OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conexion);
				
				conexion.Open();
				adaptador.Fill(ds,"muestra");
			} catch (Exception) {
				
				ds = null;
			}
			
			ConexionDatos.desconectarAccess();
			return ds;
		}*/
		public static DataSet obtenerImagenesCompleto(){
			DataSet ds = new DataSet();
            try
            {
                conexion = ConexionDatos.conectarAccess();
                string sql = "SELECT id_muestra FROM imagen,muestra WHERE imagen.id_muestra = muestra.ID";
                OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conexion);
                conexion.Open();
                adaptador.Fill(ds, "imagen");
            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                ds = null;
            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
			
			return ds;
		}
		
		public static DataSet tablaMuestras(){
			DataSet ds = new DataSet();
            try
            {
                conexion = ConexionDatos.conectarAccess();
                string sql = "SELECT * FROM muestra";
                OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conexion);
                conexion.Open();
                adaptador.Fill(ds, "muestra");

            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                ds = null;
            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
			
			return ds;
		}
		
		public static DataSet listarAtributos(){
			DataSet ds = new DataSet();
            try
            {
                conexion = ConexionDatos.conectarAccess();
                string sql = "SELECT muestra, fecha_ingreso, batch_lote, clase, fueraDeTipo, danioBiologico, granoPOP, color_grano, color_Marlo, observacion FROM muestra,atributo WHERE atributo.id_muestra = muestra.ID";
                OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conexion);
                conexion.Open();
                adaptador.Fill(ds, "nueva");
            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                ds = null;
            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
			
			return ds;
		}
		
		public static Muestra obtenerMuestraAtributos(String nombre){
			Muestra muestra = null;
            try
            {
                conexion = ConexionDatos.conectarAccess();

                int id_muestra = DAOAtributos.buscarMuestraPorNumero(nombre);
                OleDbCommand cmd = conexion.CreateCommand();
                cmd.CommandText = "SELECT * FROM muestra,atributo WHERE muestra.ID = " + id_muestra + " AND atributo.id_muestra = muestra.ID";
                conexion.Open();
                OleDbDataReader lector = cmd.ExecuteReader();
                while (lector.Read())
                {
                    muestra = new Muestra();
                    muestra.BatchLote = lector["batch_lote"].ToString();
                    muestra.Nombre = lector["muestra"].ToString();
                    muestra.FechaIngreso = lector["fecha_ingreso"].ToString();
                    muestra.Clase = lector["clase"].ToString();
                    muestra.Observacion = lector["observacion"].ToString();
                    muestra.FueraDeTipo = Convert.ToInt16(lector["fueraDeTipo"].ToString());
                    muestra.DanioBiologico = Convert.ToInt16(lector["danioBiologico"].ToString());
                    muestra.GranoPOP = Convert.ToInt16(lector["granoPOP"].ToString());
                    muestra.ColorGrano = lector["color_grano"].ToString();
                    muestra.ColorMarlo = lector["color_marlo"].ToString();
                }
            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                muestra = null;
            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
			
			return muestra;
		}

        public static Boolean ModificarMuestra(Muestra muestra, string nombreMuestra)
        {
            Boolean modificado = false;
            try
            {
                conexion = ConexionDatos.conectarAccess();
                int idMuestra = DAOAtributos.buscarMuestraPorNumero(nombreMuestra);
                string sql = "UPDATE muestra SET muestra = @muestra, fecha_ingreso = @fechaIngreso, batch_lote = @batchLote, clase = @clase WHERE ID = @idMuestra";
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                conexion.Open();
                cmd.Parameters.AddWithValue("@muestra", muestra.Nombre);
                cmd.Parameters.AddWithValue("@fechaIngreso", muestra.FechaIngreso);
                cmd.Parameters.AddWithValue("@batchLote", muestra.BatchLote);
                cmd.Parameters.AddWithValue("@clase", muestra.Clase);
                cmd.Parameters.AddWithValue("@idMuestra", idMuestra);
                cmd.ExecuteNonQuery();

                modificado = true;

            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                modificado = false;
            }
            finally
            {
                ConexionDatos.desconectarAccess();
            }

            return modificado;
        }

		public static Boolean ModificarMuestraAtributo(Muestra muestra,string nombreMuestra){
			Boolean modificado = false;
            try
            {
                conexion = ConexionDatos.conectarAccess();
                int idMuestra = DAOAtributos.buscarMuestraPorNumero(nombreMuestra);
                string sql = "UPDATE atributo SET fueraDeTipo = @fueraDeTipo, danioBiologico = @danioBiologico, granoPOP = @granoPOP, color_grano = @color_grano, color_marlo = @color_marlo, observacion = @observacion WHERE id_muestra = @idMuestra";
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                conexion.Open();
                cmd.Parameters.AddWithValue("@fueraDetipo", muestra.FueraDeTipo);
                cmd.Parameters.AddWithValue("@danioBiologico", muestra.DanioBiologico);
                cmd.Parameters.AddWithValue("@granoPOP", muestra.GranoPOP);
                cmd.Parameters.AddWithValue("@color_grano", muestra.ColorGrano);
                cmd.Parameters.AddWithValue("@color_marlo", muestra.ColorMarlo);
                cmd.Parameters.AddWithValue("@observacion", muestra.Observacion);
                cmd.Parameters.AddWithValue("@idMuestra", idMuestra);
                cmd.ExecuteNonQuery();

                modificado = true;

            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                modificado = false;
            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
			
			return modificado;
		}
		public static Boolean modificarImagen(String ruta, int idMuestra){
            Boolean correcto = false;
            try
            {
                conexion = ConexionDatos.conectarAccess();
                string sql = "UPDATE imagen SET destino_imagen = @destino_imagen WHERE id_muestra = @id_muestra";
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                cmd.Parameters.AddWithValue("@destino_imagen", ruta);
                cmd.Parameters.AddWithValue("@id_muestra", idMuestra);
                conexion.Open();
                cmd.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);

            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
            return correcto;
		}

        public static Boolean eliminarMuestra(string nombre, int idMuestra, string rutaImagen)
        {
            Boolean eliminado = false;
            try
            {
                conexion = ConexionDatos.conectarAccess();
                //eliminar muestra
                string sql = "DELETE FROM muestra WHERE muestra = @muestra";
                OleDbCommand cmd = new OleDbCommand(sql, conexion);
                cmd.Parameters.AddWithValue("@muestra", nombre);
                conexion.Open();
                cmd.ExecuteNonQuery();
                //eliminar atributo
                string sql1 = "DELETE FROM atributo WHERE id_muestra = @idMuestra";
                OleDbCommand cmd1 = new OleDbCommand(sql1, conexion);
                cmd.Parameters.AddWithValue("@idMuestra", idMuestra);
                cmd.ExecuteNonQuery();
                //eliminar imagen
                string sql2 = "DELETE FROM imagen WHERE id_muestra = @idMuestra";
                if (!rutaImagen.Equals(""))
                {
                    System.IO.File.Delete(rutaImagen);
                }
                OleDbCommand cmd2 = new OleDbCommand(sql2, conexion);
                cmd.Parameters.AddWithValue("@idMuestra", idMuestra);
                cmd.ExecuteNonQuery();

                eliminado = true;
            }
            catch (Exception ex)
            {
                EscribirLog.escribirArchivo(ex.Message);
                eliminado = false;

            }
            finally 
            {
                ConexionDatos.desconectarAccess();
            }
            
            return eliminado;
        }
		
	}
}
